#ifndef CWHS_H
#define CWHS_H

#include <QString>
#include <QFile>
#include <QPainter>
#include <QPushButton>
//#include <QListWidget>
#include "cwhsobject.h"

#define MAX_PATH    260
#define LF_FACESIZE         32

struct  WHSHEADER // ЗАГОЛОВОК ФАЙЛА WHS
{
    char  wLabel[2]; // Метка формата файла 'HW'
    short iVersion; // Номер версии файла
};

struct LOGFONTI
{
    short     lfHeight;
    short     lfWidth;
    short     lfEscape;
    short     lfOrient;
    short     lfWeight;
    unsigned char      lfItalic;
    unsigned char      lfUnderline;
    unsigned char      lfStrikeOut;
    unsigned char      lfCharSet;
    unsigned char      lfOutPrec;
    unsigned char      lfClipPrec;
    unsigned char      lfQuality;
    unsigned char      lfPAndFam;
    char      lfFaceName[LF_FACESIZE];
};

typedef struct tagSYMBOLSTRUCT  { // СТРУКТУРА РАЗМЕЩЕНИЯ СИМВОЛА
    int Vector[2]; // Координаты вектора
    float fScale; // Масштаб символа
    int iAngle; // Угол ориентации символа
    int iCode; // Код идентификации символа
    int iReserved;
    unsigned char bLibrary; // Индекс библиотеки
    unsigned char bReserved;
} SYMBOLSTRUCT;

typedef struct tagSYMBOLSTRUCTSH { // СТРУКТУРА РАЗМЕЩЕНИЯ СИМВОЛА в коротком формате
    short Vector[2]; // Координаты вектора
    char fScale[4]; // Масштаб символа
    short iAngle; // Угол ориентации символа
    short iCode; // Код идентификации символа
    short iReserved;
    unsigned char bLibrary; // Индекс библиотеки
    unsigned char bReserved;
} SYMBOLSTRUCTSH;

typedef struct tagWGEFLAGSSH { // СТРУКТУРА ИНДИКАТОРОВ
    unsigned short uiMinimize : 1; // Кнопка минимизации
    unsigned short uiMaximize : 1; // Кнопка максимизации
    unsigned short uiSystem : 1; // Системное меню
    unsigned short uiMove : 1; // Перемещение
    unsigned short uiSize : 1; // Изменение размеров окна
    unsigned short uiClose : 1; // Закрытие окна
    unsigned short uiScale : 1; // Масштабирование фона
    unsigned short uiAlldesktops : 1; // Общее окно
    unsigned short uiVisible : 1; // Индикатор видимости окна
    unsigned short uiClipsiblings : 1;
    unsigned short uiDrag : 1;
    unsigned short uiTReload : 1;
    unsigned short uiTOmed : 1;
    unsigned short uiTransparent : 1;
    unsigned short uiReserved : 2; // Резервируемые поля
} WGEFLAGSSH;

typedef struct tagWIND_GENSH  { // Тип данных
    short pntLocation[2]; 	// Координаты окна
    short siSize[2];		// Размер окна
    short iFormat;		// Код формата окна
    short iIdentification;		// Код идентификации окна
    short iViews;		// Количество видов
    short iView;		// Номер текущего вида
    short iLastObject;		// Идентификатор последнего объекта
    short iDesktop;		// Позиция в группе окон
    short hGeneral;		// Дескриптор окна
    short hButtons;		// Дескриптор списка кнопок
    short hObjects;		// Дескриптор списка объектов
    short iHighlighted;		// Индекс объекта для подсветки
    short hIcon;		// Дескриптор пиктограммы
    char szIcon [14];		// Имя файла пиктограммы
    char szFile [14];		// Имя фонового файла окна
    char szWHSFile [64];	// Имя файла WHS
    char szTitle [128];		// Заголовок окна
    //  WGEFLAGSSH Flags;	// Поле индикаторов
    unsigned short Flags;	// Поле индикаторов
    unsigned char bBackground;	// Индекс фонового цвета
    unsigned char bDesktopIndex;	// Индекс группы окон
    short hAnimations;		// Список файлов FLI
    short hRTE;		// Дескриптор объекта RTE TE
    short iRTEmode;		// Стартовый режим RTE
    unsigned short wReserved;	// Резервируемое слово
} WIND_GENSH;

struct WINBTNSH2
 {
  short  iCode;                  // Код объекта
  short iIdentification;      // Код идентификации объекта
  short iView;                   // Код вида объектов
  char szFile[36];             // Имя файла
  short x,y;                       // Координаты кнопки (pntLocation)
  short cx,cy;                   // Размеры кнопки (sizSize)
  short hButton;               // Дескриптор кнопки
  short hText;                  // Дескриптор текстовой строки
  short iText;                   // Длина текстовой строки
  unsigned short Flags;   // Поле индикаторов
//  struct // ПОЛЕ ИНДИКАТОРОВ
//  {
//    unsigned short fAUTOBUTTON : 1; // Индикатор вида кнопки
//    unsigned short fFRAME      : 1;         // Индикатор рамки
//    unsigned short fENABLE     : 1;        // Индикатор активности
//    unsigned short fALLVIEWS   : 1;     // Индикатор общей кнопки
//    unsigned short fCHECKED    : 1;      // Индикатор нажатия кнопки
//    unsigned short fHIDDEN     : 1;        // Индикатор скрытой кнопки
//    unsigned short fRESERVED   : 10;   // Резервируемые поля
//  }
  LOGFONTI lgFont; // Фонт кнопки
  unsigned char bFrame; // Цвет рамки
  unsigned char bBackgroundUp; // Фоновые цвета
  unsigned char bBackgroundDown; // кнопки
  unsigned char bTextUp; // Цвета
  unsigned char bTextDown;  // текста
  unsigned char bReserved; // Резервируемый байт
 };

typedef struct tagTRACE_SSH
{
    short   iTraceCode; // Код перемещения
    short SPnt[2],SAbs[2]; // Стартовая точка
    short EPnt[2],EAbs[2]; // Конечная точка
    char    dX[8];                                // Шаг параметров положения
    char    dY[8];                                // Шаг параметров положения
    char    dA[8];                                // Шаг параметров положения
    char    dScale[8];                            // Шаг масштаба
    char    dRotation[8];                         // Шаг угла поворота
    short   iQuantity;                            // Количество положений
    short   iRange[2];                            // Диапазон положений
    short   iLocation;                            // Текущее положение объекта
    short   hReserved[2];                         // Резервируемые
    short   iReserved[2];                         // поля
    short  Cl[4];                                   // Область отсечения
    short ClPt[8];                              // Дополнительные точки
    short   iClipCode;                            // Код региона отсечения
    struct                                        // СТРУКТУРА ИНДИКАТОРОВ
    {
        unsigned short fTANG       : 1;                      // Размещение по касательной
        unsigned short fMATRX      : 1;                      // Активность матрицы
        unsigned short fCLIP       : 1;                      // Индикатор       отсечения
        unsigned short fFREE       : 1;                      //      свободной траектории
        unsigned short fRESRV      : 12;                     // Резервируемые поля
    } Flags;                                      // Поле индикаторов
} TRACE_SSH;                                    // Тип данных

typedef struct  tagWINOBJSH3  // СТРУКТУРА ЭЛЕМЕНТА СПИСКАОБЪЕКТОВ версии > 5
{
        char szFile[36]; // Имя файла
        short iCode; // Код объекта
        short x; int y; // Координаты верхнего угла
        short sizSize[2]; // Размеры объекта
        short sizSteps[2];                               // Шаг размещения
        short iCounter;                               // Количество объектов
        short  hObject;                               // номер объекта в таблице
        short  hText;                                  // Дескриптор строки
        short iText; // Длина строки
        short iSelect;                                 // Позиция при редактировании
        short iIdentification;                         // Код идентификации объекта
        short iView;                                   // Код вида объектов
        short iPolyline; // Количество точек
        unsigned int Flags; // Поле индикаторов
 /*
  struct // ПОЛЕ ИНДИКАТОРОВ
  {
  unsigned int fACTIVE		: 1;	// 0  признак активности (если есть текст при подсветки, то надо вывести в рамке)
  unsigned int fHIGHLIGHT	: 1;	// 1 признак подсветки (при наведении мыши границы объекта выделяются)
  unsigned int fNEXT		: 1;	// 2  продолжения поиска
  unsigned int fALLVIEWS		: 1;	// 3  общего объекта
  unsigned int fVISIBLE		: 1;	// 4  видимости
  unsigned int fDETECTIVE	: 1;	// 5  детектируемости
  unsigned int fHIGHLIGHTED	: 1;	// 6  подсветки
  unsigned int fBACKMODE	: 1;	// 7 Фоновый режим
  unsigned int fMARKED		: 1;	// 8 Бит маркировки
  unsigned int fMIRROR		: 1;	// 9 Индикатор отображения
  unsigned int fSIZE		: 1;	// 10 размера
  unsigned int fROTATE		: 1;	// 11 поворота
  unsigned int fBACKGROUND	: 1;	// 12 фонового объекта
  unsigned int fTRACE		: 1;	// 13 динамического объекта
  unsigned int fEDIT		: 1;	// 14 редактирования
  unsigned int fCOPY		: 1;	// 15 копии
  unsigned int fFGDIPLUS		: 1;	// 16
  unsigned int fFROUND		: 1;	// 17 скругления
  unsigned int fFPATH		: 1;	// 18
  unsigned int fFBEZIERS		: 1;	// 19
  unsigned int fFSCALE		: 1;	// 20
  unsigned int fFROTATE		: 1;	// 21
  unsigned int fBACKMODEBR	: 1;	// 22
  unsigned int fF23		: 1;	// 23
  unsigned int fFTEXTURE	: 1;	// 24 текстуры
  unsigned int fFFORMAT		: 1;	// 25
  unsigned int fFTABS		: 1;	// 26
  unsigned int fF27		: 1;	// 27
  unsigned int fFCLONE		: 1;	// 28
  unsigned int fFCLONESIZE	: 1;	// 29
  unsigned int fFROTOBJ		: 1;	// 30
  unsigned int fF31		: 1;	// 31
  } Flags;
 */
        short  hTrace;  // Дескриптор траектории
        short  hOriginal;                              // Дескриптор оригинала
        unsigned short wCopy;                                    // Резервируемые дескрипторы
        unsigned char bFrameColor;                              // Цвет пера
        unsigned char bFrameStyle;                              // Стиль пера
        unsigned char bFillColor;                               // Цвет кисти
        unsigned char bBackground;                              // Фоновый цвет
        unsigned char bFillStyle;                               // Стиль кисти
        unsigned char bWidth; // Толщина пера
        unsigned char bTextColor;                               // Цвет текста
        unsigned char bReserved;                                // Резервируемый байт
        short xSrc;                                    // Координаты левого
        short ySrc;                                    // верхнего угла источника
        short pCentre[2];                               // центр вращения объекта
        double dScale; // Масштаб (Flags.fFSCALE)
        double dAngle;                                 // угол поворота объекта
        double fAngleStart;
        double fAngleEnd;
        union
        {
            short Points[8];
            SYMBOLSTRUCTSH Symbol;
        };
        short pBrushstart[2];
 short pBrushend[2];
 double dScale_Y;
 double dScaleFocusX;
 double dScaleFocusY;
 unsigned char bFillColorBr; // Прозрачность кисти
 unsigned char bBackgroundBr;
 unsigned char bStringAlignment; // Код выравнивания строки
 unsigned char bPenBr;
 unsigned int dwVersion_obj;
 unsigned char bFrameColorA;
 unsigned char bFrameColorR, bFrameColorG, bFrameColorB; // Цвет пера
 unsigned char bFillColorA;
 unsigned char bFillColorR, bFillColorG, bFillColorB;  // Цвет кисти
 unsigned char bBackgroundA;
 unsigned char bBackgroundR;
 unsigned char bBackgroundG;
 unsigned char bBackgroundB;
 unsigned char bTextColorA;
 unsigned char bTextColorR;
 unsigned char bTextColorG;
 unsigned char bTextColorB;
 unsigned short wFrameColorOtt;
 unsigned short wFillColorOtt;
 unsigned short wBackgroundOtt;
 unsigned short wTextColorOtt;
 unsigned char bFrameColorCont;
 unsigned char bFillColorCont;
 unsigned char bBackgroundCont;
 unsigned char bTextColorCont;
 unsigned char bFrameColorBright;
 unsigned char bFillColorBright;
 unsigned char bBackgroundBright;
 unsigned char bTextColorBright;
 unsigned short wFrame;
 unsigned short wFrameCount;
 unsigned short wDever;
 unsigned short wDever2;
 char szReserved[32];
} WINOBJSH3;

struct Window_Animation  // ОПРЕДЕЛЕНИЕ КЛАССА
{                                               // window_animation
 public :                                       // ОБЩИЕ ПЕРЕМЕННЫЕ
  int iIdentification;                          // Код идентификации объекта
  int iView;                                    // Код вида объектов
  char szFile[56];                              // Имя файла
  char szFileFon[56];                           // Имя файла
  int pntLocation[2];                            // Координаты
  int sizSize[2];                                 // Размеры
  void * hObject;                               // Дескриптор объекта
  struct  // ПОЛЕ ИНДИКАТОРОВ
  {
    unsigned int fALLVIEWS    : 1;                      // Индикатор общего объекта
    unsigned int fVISIBLE     : 1;                      // Индикатор видимости
    unsigned int fMARKED      : 1;                      // Бит маркировки
    unsigned int fLOADED      : 1;
    unsigned int fMOUSES      : 1;
    unsigned int fPICKQUICK   : 1;
    unsigned int fF27         : 1;
    unsigned int fCODED       : 1;
    unsigned int fDECODED     : 1;
    unsigned int fCONTEINER   : 1;
    unsigned int fFTEXTURE    : 1;
    unsigned int fFONTBOLD    : 1;
    unsigned int fFONTITALIC  : 1;
    unsigned int fMOUSEMOVE   : 1;
    unsigned int fVIDEO       : 1;
    unsigned int fRESERVED    : 17;  // Резервируемые поля
  } Flags;
  void* CAppShow; //CAppShow*  g_AppShow ;
  unsigned char bBackground;                             // Фоновый цвет
  unsigned char bReserved1;                              // Резервируемый байт
  unsigned char bColorText;
  unsigned char bColorFon;
  unsigned char bColorCon;
  unsigned char bStyleText;                              // Стиль пера
  unsigned char bStyleCon;                               // Стиль пера
  unsigned char bWidthCon;                               // Стиль пера
  char szFont[32];                              // Имя файла
  int  iSizeFont;
  unsigned char bBackgroundA;                            // Фоновый цвет
  unsigned char bBackgroundR;                            // Фоновый цвет
  unsigned char bBackgroundG;                            // Фоновый цвет
  unsigned char bBackgroundB;                            // Фоновый цвет
  unsigned char bColorTextA;
  unsigned char bColorTextR;
  unsigned char bColorTextG;
  unsigned char bColorTextB;
  unsigned char bColorFonA;
  unsigned char bColorFonR;
  unsigned char bColorFonG;
  unsigned char bColorFonB;
  unsigned char bColorConA;
  unsigned char bColorConR;
  unsigned char bColorConG;
  unsigned char bColorConB;
  unsigned short wBackgroundOtt;
  unsigned char bBackgroundCont;
  unsigned char bBackgroundBright;
  unsigned short wColorTextOtt;
  unsigned char bColorTextCont;
  unsigned char bColorTextBright;
  unsigned short wColorFonOtt;
  unsigned char bColorFonCont;
  unsigned char bColorFonBright;
  unsigned short wColorConOtt;
  unsigned char bColorConCont;
  unsigned char bColorConBright;
  unsigned char bSmoothDefault;
  unsigned char bSmoothAngle;
  char szReserved[98]; // Имя файла
};

class CWhs
{
public:
    CWhs();
    ~ CWhs();

public:
    short x,y;                     // Координаты окна
    short cx,cy;                  // Размер окна
    short iRTEmode;         // Стартовый режим
    short iIdentification;    // Код идентификации окна
    short iDesktop;             // Код группы окон
    short iView;                  // Номер вида окна
    unsigned short Flags;    // Поле индикаторов (WGEFLAGSSH)
    unsigned short adFlags; // Поле индикаторов (fACTIVE)
    QColor fon; // Цвет фона окна

public:
    QVector<CWhsObject*> obj;
    void Show(QPainter* p, short view, short hlight = 0) {
        for(int i = 0; i < obj.size(); i++)  obj.at(i)->Show(p, view, hlight);
    }

public:
    WHSHEADER header;
    WIND_GENSH gensh;

    short wCounter; // Количество элементов
    short wSizesh; //Размер элемента внешний
    short wIncrease; // Размер приращения при вставке?
    char* Array;
    char* ArrayPointsh;
    QStringList ArrayStr;
    TRACE_SSH* ArrayTrace;
    LOGFONTI* ArrayFont;

    short wCounterB; // Количество элементов button
    short wSizeshB; //Размер элемента внешний button
    short wIncreaseB; // Размер приращения при вставке button?
    char* ArrayBt;
    QStringList ArrayStrBt;
    QVector<QPushButton*> but;

    short wCounterF; // Количество элементов Fli
    short wSizeshF; //Размер элемента внешний Fli
    short wIncreaseF; // Размер приращения при вставке Fli?
    char* ArrayFl;
    unsigned int Rte;

    bool createWhsObjects(); // Создание списка объектов Whs
    bool loadWhs(QString FileName);
    void showWhs(QPainter* p);
    void showButtons(QWidget *parent);
    bool dumpWhs();
    int checkWhs(QPoint p);
    short hlight;
    int width, height; // Размеры окна
};

#endif // CWHS_H
